/**
|--------------------------------------------------
| 给你一个整数数组 nums，有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。
你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。

输入：nums = [1,3,-1,-3,5,3,6,7], k = 3
输出：[3,3,5,5,6,7]
解释：
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

 输入：nums = [1], k = 1
输出：[1]
|--------------------------------------------------
*/
//!注意 q双端队列存的是下标
var maxSlidingWindow = function (nums, k) {
  const q = [] //双端队列
  const ans = [] //存结果
  for (let i = 0; i < nums.length; i++) {
    // 这个循环里会把比当前小的全部 删除掉
    while (q.length && nums[i] >= nums[q[q.length - 1]]) {
      q.pop()
    }
    q.push(i) //添加下标
    //队头 已经超过滑动窗口外了 就移出
    while (q[0] <= i - k) {
      q.shift() //删除 头部
    }
    //超过i=2之后 单调递减队头就是滑动窗口的最大值
    if (i >= k - 1) ans.push(nums[q[0]])
  }
  return ans
}
console.log('maxSlidingWindow', maxSlidingWindow([1, 3, -1, -3, 5, 3, 6, 7], 3))
